#include "TaskQueue.h"

TaskQueue::TaskQueue(size_t capa)
:_capacity(capa)
    ,_que()
    ,_mutex()
    ,_notEmpty()
    ,_notFull()
    ,_flag(true)
{

}

TaskQueue::~TaskQueue()
{

}

//生产数据与消费数据
void TaskQueue::push(ElemType &&taskcb)
{
    unique_lock<mutex> ul(_mutex);
    while(full())
    {
        _notFull.wait(ul);
    }
    _que.push(std::move(taskcb));
    _notEmpty.notify_one();
}

ElemType TaskQueue::pop()
{
    unique_lock<mutex> ul(_mutex);
    while(empty() && _flag)
    {
        _notEmpty.wait(ul);
    }
    if(_flag)
    {
        ElemType temp = _que.front();
        _que.pop();
        _notFull.notify_one();

        return temp;
    }else{
        return nullptr;
    }
}

//判空与判满
bool TaskQueue::empty() const
{
    if(_que.size() ==0){
        return true;
    }else{
        return false;
    }
}

bool TaskQueue::full() const
{
    if(_capacity == _que.size())
    {
        return true;
    }else{
        return false;
    }
}

//唤醒所有在_notEmpty条件变量上的线程
void TaskQueue::wakeup(){
    _flag = false;
    _notEmpty.notify_all();
}

